﻿using LJH.SmartAlarmSystem.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LJH.SmartAlarmSystem.UControls
{
    public partial class URoundedPanel : Panel
    {
        /// <summary>
        /// 存储矩形绘制工作区域，用于计算Panel的圆角路径
        /// </summary>
        Rectangle _clientRect;

        public URoundedPanel()
        {
            InitializeComponent();

            #region 设置控件样式标志
            SetStyle(ControlStyles.Selectable, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);     // 忽略窗口消息，减少闪烁
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);    // 绘制到缓冲区，减少闪烁
            SetStyle(ControlStyles.UserPaint, true);                // 控件由其自身而不是操作系统绘制
            SetStyle(ControlStyles.ResizeRedraw, true);             // 控件调整其大小时重绘
            SetStyle(ControlStyles.SupportsTransparentBackColor, true); // 支持透明背景
            #endregion

            _clientRect = this.ClientRectangle;

            #region 默认样式配置
            this.BackColor = Color.Transparent;
            this.BorderStyle = BorderStyle.None;
            #endregion
        }

        #region 属性扩展：主背景色、次背景色、背景色渐变模式、边框粗细、边框颜色圆角半径
        /// <summary>
        /// 圆角Panel的主背景颜色
        /// </summary>
        [DefaultValue(typeof(Color), "Gray")]
        [Description("设置控件的主背景颜色，默认为灰色")]
        public Color PrimaryBackgroundColor
        {
            get { return _primaryBackgroundColor; }
            set
            {
                _primaryBackgroundColor = value;
                Invalidate();
            }
        }
        private Color _primaryBackgroundColor = Color.Gray;

        /// <summary>
        /// 圆角Panel的次背景颜色，默认为透明。当该属性被设置为其他颜色时，Panel的背景色将展现为一个从主背景色到次背景色的渐变效果
        /// </summary>
        [DefaultValue(typeof(Color), "Transparent")]
        [Description("设置控件的次背景颜色，默认为透明。当该属性被设置为其他颜色时，Panel的背景色将展现为一个从主背景色到次背景色的渐变效果")]
        public Color SecondaryBackgroundColor
        {
            get { return _secondaryBackgroundColor; }
            set
            {
                _secondaryBackgroundColor = value;
                Invalidate();
            }
        }
        private Color _secondaryBackgroundColor = Color.Transparent;

        /// <summary>
        /// 圆角Panel背景颜色的渐变方向，默认为垂直渐变，该属性仅在次背景颜色被设置时生效
        /// </summary>
        [DefaultValue(typeof(LinearGradientMode), "Vertical")]
        [Description("设置控件背景颜色的渐变方向，默认为垂直渐变，该属性仅在次背景颜色被设置时生效")]
        public LinearGradientMode BackgroundGradientMode
        {
            get { return _backgroundGradientMode; }
            set
            {
                _backgroundGradientMode = value;
                Invalidate();
            }
        }
        private LinearGradientMode _backgroundGradientMode = LinearGradientMode.Vertical;

        /// <summary>
        /// 圆角Panel的边框粗细（单位：像素）
        /// </summary>
        [DefaultValue(typeof(int), "0")]
        [Description("设置控件的边框粗细（单位：像素）")]
        public int BorderWidth
        {
            get { return _borderWidth; }
            set
            {
                _borderWidth = value;
                Invalidate();
            }
        }
        private int _borderWidth = 0;

        /// <summary>
        /// 圆角Panel的边框颜色，默认为灰色
        /// </summary>
        [DefaultValue(typeof(Color), "Gray")]
        [Description("设置控件的边框颜色，默认为灰色")]
        public Color BorderColor
        {
            get { return _borderColor; }
            set
            {
                _borderColor = value;
                Invalidate();
            }
        }
        private Color _borderColor = Color.Gray;

        /// <summary>
        /// 圆角Panel的圆角半径（单位：像素），半径为0表示直角
        /// </summary>
        [DefaultValue(typeof(int), "5")]
        [Description("设置控件的圆角半径（单位：像素），半径为0表示直角")]
        public int RoundRadius
        {
            get { return _roundRadius; }
            set
            {
                _roundRadius = Math.Max(0, value); // 确保不小于0
                Invalidate();
            }
        }
        private int _roundRadius = 5;
        #endregion

        #region 重绘控件
        /// <summary>
        /// 控件缩放发生变化时调用该逻辑进行控件重绘
        /// </summary>
        /// <param name="e">事件参数</param>
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);                      // 调用基类方法，确保基础事件逻辑执行
            _clientRect = this.ClientRectangle;         // 更新控件客户区矩形（包含内边距的区域）
            this.Region = new Region(_clientRect);      // 设置控件的可绘制区域为当前矩形（支持圆角裁剪）
            _clientRect.Width -= 1;                     // 调整宽度，避免绘制时超出边界
            _clientRect.Height -= 1;                    // 调整高度，同上
        }

        /// <summary>
        /// 控件的自定义绘制逻辑，负责渲染外观（如背景、边框、圆角等）
        /// </summary>
        /// <param name="e">包含绘图上下文和区域信息的参数</param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e); // 调用基类方法，确保默认焦点框等逻辑执行
            Graphics g = e.Graphics; // 获取Graphics对象，用于所有GDI+绘图操作
            g.SmoothingMode = SmoothingMode.HighQuality; // 启用抗锯齿，提升圆角和平滑渐变的质量[3,5](@ref)

            // 1. 计算圆弧半径
            int borderRadius = _roundRadius; // 边框的圆角半径
            int backgroundRadius = Math.Max(_roundRadius - _borderWidth, 0); // 背景的圆角半径（需减去边框宽度）

            // 2. 计算矩形区域
            Rectangle borderRect = _clientRect; // 边框的绘制区域（完整控件大小）
            Rectangle backgroundRect = new Rectangle(
                _clientRect.X + _borderWidth, // 背景的X坐标（内缩边框宽度）
                _clientRect.Y + _borderWidth, // 背景的Y坐标（同上）
                Math.Max(_clientRect.Width - 2 * _borderWidth, 0),    // 宽度调整（避免负值）
                Math.Max(_clientRect.Height - 2 * _borderWidth, 0));  // 高度调整（同上）

            // 3. 生成圆角路径
            GraphicsPath borderPath = PaintClass.GetRoundedRectangle(borderRect, borderRadius); // 边框的圆角路径
            GraphicsPath backgroundPath = PaintClass.GetRoundedRectangle(backgroundRect, backgroundRadius); // 背景的圆角路径

            // 4. 绘制边框（仅当边框宽度>0时）
            if (_borderWidth > 0)
            {
                using (Brush borderBrush = new SolidBrush(_borderColor)) // 创建纯色画刷
                {
                    g.FillPath(borderBrush, borderPath); // 填充边框路径
                }
            }

            // 5. 绘制背景（支持纯色或线性渐变）
            using (Brush backgroundBrush = _secondaryBackgroundColor != Color.Transparent
                ? new LinearGradientBrush(backgroundRect, _primaryBackgroundColor, _secondaryBackgroundColor, _backgroundGradientMode) // 渐变画刷
                : new SolidBrush(_primaryBackgroundColor)) // 纯色画刷
            {
                g.FillPath(backgroundBrush, backgroundPath); // 填充背景路径
            }
        }
        #endregion
    }
}
